package com.xiaozhichao.javaapi.designpattern.proxy;


import org.springframework.cglib.proxy.Enhancer;

import java.lang.reflect.Proxy;

/**
 * cglib针对类代理
 * 采用的是继承的方式代理，所以被代理类或方法不要用final
 * 类使用final，不可继承，则代理运行报错
 * 方法final，只是代理无效
 * 底层采用ASM字节码生成框架
 * 利用ASM开源包，对代理对象类的class文件加载进来，通过修改其字节码生成子类来处理
 */
public class CglibProxyTest {

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(BaseSecond.class);
        enhancer.setCallback(new CglibMethodInterceptor());
        BaseSecond baseSecond  = (BaseSecond)enhancer.create();
        baseSecond.method1("join",13);

        System.out.println("==============================");

        Enhancer enhancer1 = new Enhancer();
        enhancer1.setSuperclass(BaseImp.class);
        enhancer1.setCallback(new CglibMethodInterceptor());
        BaseImp baseSecond1  = (BaseImp)enhancer1.create();
        baseSecond1.method1("join",13);
    }
}
